/* 
 * File:   swap.h
 * Author: aple
 */

#ifndef __SWAP_N_H_
#define	__SWAP_N_H_

#include "stdint.h"
#include "stdlib.h"

#ifdef	__cplusplus
extern "C" {
#endif

/****************************************************************************
 * 字节内 位交换,p_src p_des可以同地址，但不能是其他情况的交叉区间
 * Len - 元素数量
 * **************************************************************************/
void swap_u8_with_bit(void *p_src, void *p_des, uint16_t Len);
/****************************************************************************
 * 半字内 位交换,p_src p_des可以同地址，但不能是其他情况的交叉区间
 * Len - 元素数量
 * **************************************************************************/
void swap_u16_with_bit(void *p_src, void *p_des, uint16_t Len);
/****************************************************************************
 * 字内 位交换,p_src p_des可以同地址，但不能是其他情况的交叉区间
 * Len - 元素数量
 * **************************************************************************/
void swap_u32_with_bit(void *p_src, void *p_des, uint16_t Len);
    
/****************************************************************************
 * 字节内 半字节交换,p_src p_des可以同地址，但不能是其他情况的交叉区间
 * Len - 元素数量
 * **************************************************************************/
void swap_u8_with_u4(void *p_src, void *p_des, uint16_t Len);
/****************************************************************************
 * 半字内 半字节交换,p_src p_des可以同地址，但不能是其他情况的交叉区间
 * Len - 元素数量
 * **************************************************************************/
void swap_u16_with_u4(void *p_src, void *p_des, uint16_t Len);
/****************************************************************************
 * 字内 半字节交换,p_src p_des可以同地址，但不能是其他情况的交叉区间
 * Len - 元素数量
 * **************************************************************************/
void swap_u32_with_u4(void *p_src, void *p_des, uint16_t Len);

/****************************************************************************
 * 半字内 字节交换,p_src p_des可以同地址，但不能是其他情况的交叉区间
 * Len - 元素数量
 * **************************************************************************/
void swap_u16_with_u8(void *p_src, void *p_des, uint16_t Len);
/****************************************************************************
 * 字内 字节交换,p_src p_des可以同地址，但不能是其他情况的交叉区间
 * Len - 元素数量
 * **************************************************************************/
void swap_u32_with_u8(void *p_src, void *p_des, uint16_t Len);
/****************************************************************************
 * 列表 字节交换,p_src p_des可以同地址，但不能是其他情况的交叉区间
 * Len - 元素数量 Len >= 2
 * **************************************************************************/
void swap_list_with_u8(void *p_src, void *p_des, uint16_t Len);
/****************************************************************************
 * 列表 半字交换,p_src p_des可以同地址，但不能是其他情况的交叉区间
 * Len - 元素数量 Len >= 2
 * **************************************************************************/
void swap_list_with_u16(void *p_src, void *p_des, uint16_t Len);
/****************************************************************************
 * 列表 字交换,p_src p_des可以同地址，但不能是其他情况的交叉区间
 * Len - 元素数量 Len >= 2
 * **************************************************************************/
void swap_list_with_u32(void *p_src, void *p_des, uint16_t Len);
/****************************************************************************
 * bit map 位行列交换   需要堆栈8bytes  转置数据长度8byte
 * **************************************************************************/
void swap_bit_map_u8(void *p_src, void *p_des);
/****************************************************************************
 * bit map 位行列交换   需要堆栈32bytes   数据地址半字对齐 转置数据长度16short
 * **************************************************************************/
void swap_bit_map_u16(void *p_src, void *p_des);
/****************************************************************************
 * bit map 位行列交换   需要堆栈128bytes  数据地址字对齐  转置数据长度32long
 * **************************************************************************/
void swap_bit_map_u32(void *p_src, void *p_des);

/****************************************************************************
 * bit map 位行列交换 ,行宽 n bit。 图容量 ((n + 7) >> 3) * n  bytes，内用malloc
 * **************************************************************************/
void swap_bit_map_bn(void *p_src, void *p_des, uint16_t n);

/****************************************************************************
 * bit map 位行列交换, 内部使用malloc，须保证malloc分配的内存是4字节对齐的
 * **************************************************************************/
void swap_bit_map_u32_alloc(void *p_src, void *p_des);

/****************************************************************************
 * bit map 位行列交换 - 打包
 * **************************************************************************/
void swap_bit_map_u8_multi(void *p_src, void *p_des, size_t groups);
void swap_bit_map_u16_multi(void *p_src, void *p_des, size_t groups);
void swap_bit_map_u32_multi(void *p_src, void *p_des, size_t groups);
void swap_bit_map_u32_alloc_multi(void *p_src, void *p_des, size_t groups);
void swap_bit_map_bn_multi(void *p_src, void *p_des, uint16_t n, size_t groups);

/* 循环移位 */
//dat: 数据源  bit_len(实际位数)  shift:移动位数(为简化操作，外部保证shift小于bit_len)
uint16_t bit16_roll_shift_left(uint16_t dat, uint8_t bit_len, uint8_t shift);
uint16_t bit16_roll_shift_right(uint16_t dat, uint8_t bit_len, uint8_t shift);

//u16列表数据移位，有效位固定为16。 len指定元素个数。shift指定每个数据移位数
void u16_list_roll_shift_right(uint16_t * pdat, uint16_t len, uint8_t shift);
void u16_list_roll_shift_left(uint16_t * pdat, uint16_t len, uint8_t shift);


#ifdef	__cplusplus
}
#endif


#endif	/* __SWAP_N_H_ */

